#include <iostream>
#include <cstring>
using namespace std;
class String
{
public:
  String(const char *str = "")
  {
    _str = new char[strlen(str) + 1];
    strcpy(_str, str);
  }

  String(const String &s)
  {
    // 深拷贝
    cout << "String(const String& s)-深拷贝- 代价大-效率低" << endl;
    _str = new char[strlen(s._str) + 1];
    strcpy(_str, s._str);
  }
  String(String &&s)
      : _str(nullptr)
  {
    cout << "String(String&& s)-移动拷贝- 代价小，效率高" << endl;
    swap(_str, s._str);
  }

  ~String()
  {
    delete[] _str;
  }

private:
  char *_str;
};

String f(const char *str)
{
  String tmp(str);
  return move(tmp); //  这里返回的实际是tmp临时对象
}

int main()
{

  String s1("左值");
  String s2(s1);               // 参数是左值
  String s3(f("右值-将亡值")); //参数是右值-将亡值（传递给你用，用完我就析构）

  return 0;
}